import paramiko


def execute_commands(hostname, port, username, password, command_list, require_output=False):
    """
    远程连接到Linux服务器并执行创建符号链接的命令

    参数:
        hostname: 远程服务器IP地址
        port: SSH端口号(默认22)
        username: 登录用户名
        password: 登录密码
        command: 要执行的命令(如: "ln -s 临时/tessttt/ sb_tessttt")
    """
    try:
        # 创建SSH客户端对象
        ssh = paramiko.SSHClient()

        # 自动添加主机密钥(首次连接时)
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

        print(f"正在连接到服务器 {hostname}...")

        # 建立SSH连接
        ssh.connect(hostname, port, username, password)
        print("连接成功!")

        for command in command_list:
            # 执行命令
            print(f"执行命令: {command}")
            stdin, stdout, stderr = ssh.exec_command(command)

            # 读取命令输出
            output = stdout.read().decode('utf-8')
            error = stderr.read().decode('utf-8')

            # 打印结果
            if output:
                print(f"命令输出: {output}")
                if require_output:
                    if len(command_list) == 1:  # 带output只能支持一条command
                        return output
                    else:
                        raise Exception("require_output support only one command!")
            if error:
                print(f"\033[31m[Errors]\033[0m 错误信息: {error}")
            else:
                print("命令执行完成!")

    except paramiko.AuthenticationException:
        print("认证失败，请检查用户名和密码")
    except paramiko.SSHException as e:
        print(f"\033[31m[Errors]\033[0m SSH连接错误: {e}")
    except Exception as e:
        print(f"\033[31m[Errors]\033[0m 发生错误: {e}")
    finally:
        # 确保连接被关闭
        if 'ssh' in locals():
            ssh.close()
            print("连接已关闭")


# 使用密钥认证的版本（可选）
def execute_command_with_key(hostname, port, username, key_path, command):
    """
    使用SSH密钥认证连接到Linux服务器

    参数:
        key_path: SSH私钥文件路径
    """
    try:
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

        # 加载私钥
        private_key = paramiko.RSAKey.from_private_key_file(key_path)

        print(f"使用密钥连接到服务器 {hostname}...")
        ssh.connect(hostname, port, username, pkey=private_key)

        # 执行命令
        stdin, stdout, stderr = ssh.exec_command(command)

        # 处理输出
        output = stdout.read().decode('utf-8')
        error = stderr.read().decode('utf-8')

        if output:
            print(f"命令输出: {output}")
        if error:
            print(f"错误信息: {error}")
        else:
            print("命令执行成功!")

    except Exception as e:
        print(f"错误: {e}")
    finally:
        if 'ssh' in locals():
            ssh.close()
